#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QTabWidget, 
                           QTableWidget, QTableWidgetItem, QHeaderView,
                           QLabel, QGroupBox, QSplitter)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor

class StatisticsWidget(QWidget):
    """
    统计信息窗口组件，显示协议分布和流量趋势图表
    """
    
    def __init__(self, parent=None):
        """
        初始化统计信息窗口组件
        """
        super().__init__(parent)
        self.stats_data = None
        self._setup_ui()
        
    def _setup_ui(self):
        """
        设置UI组件
        """
        # 创建主布局
        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        
        # 创建选项卡组件
        self.tab_widget = QTabWidget()
        
        # 创建协议分布选项卡
        self.protocol_tab = QWidget()
        self._setup_protocol_tab()
        self.tab_widget.addTab(self.protocol_tab, "协议分布")
        
        # 创建IP统计选项卡
        self.ip_tab = QWidget()
        self._setup_ip_tab()
        self.tab_widget.addTab(self.ip_tab, "IP统计")
        
        # 创建端口统计选项卡
        self.port_tab = QWidget()
        self._setup_port_tab()
        self.tab_widget.addTab(self.port_tab, "端口统计")
        
        # 创建警报选项卡
        self.alert_tab = QWidget()
        self._setup_alert_tab()
        self.tab_widget.addTab(self.alert_tab, "异常检测")
        
        # 添加到主布局
        layout.addWidget(self.tab_widget)
        self.setLayout(layout)
        
    def _setup_protocol_tab(self):
        """
        设置协议分布选项卡
        """
        layout = QVBoxLayout(self.protocol_tab)
        
        # 协议分布表格
        self.protocol_table = QTableWidget()
        self.protocol_table.setColumnCount(2)
        self.protocol_table.setHorizontalHeaderLabels(["协议", "数量"])
        self.protocol_table.horizontalHeader().setStretchLastSection(True)
        self.protocol_table.verticalHeader().setVisible(False)
        self.protocol_table.setColumnWidth(0, 150)
        
        layout.addWidget(self.protocol_table)
        self.protocol_tab.setLayout(layout)
        
    def _setup_ip_tab(self):
        """
        设置IP统计选项卡
        """
        layout = QVBoxLayout(self.ip_tab)
        
        # IP地址表格
        self.ip_table = QTableWidget()
        self.ip_table.setColumnCount(2)
        self.ip_table.setHorizontalHeaderLabels(["IP地址", "数量"])
        self.ip_table.horizontalHeader().setStretchLastSection(True)
        self.ip_table.verticalHeader().setVisible(False)
        self.ip_table.setColumnWidth(0, 200)
        
        layout.addWidget(self.ip_table)
        self.ip_tab.setLayout(layout)
        
    def _setup_port_tab(self):
        """
        设置端口统计选项卡
        """
        layout = QVBoxLayout(self.port_tab)
        
        # 端口表格
        self.port_table = QTableWidget()
        self.port_table.setColumnCount(2)
        self.port_table.setHorizontalHeaderLabels(["端口", "数量"])
        self.port_table.horizontalHeader().setStretchLastSection(True)
        self.port_table.verticalHeader().setVisible(False)
        self.port_table.setColumnWidth(0, 200)
        
        layout.addWidget(self.port_table)
        self.port_tab.setLayout(layout)
        
    def _setup_alert_tab(self):
        """
        设置警报选项卡
        """
        layout = QVBoxLayout(self.alert_tab)
        
        # 警报表格
        self.alert_table = QTableWidget()
        self.alert_table.setColumnCount(1)
        self.alert_table.setHorizontalHeaderLabels(["警报信息"])
        self.alert_table.horizontalHeader().setStretchLastSection(True)
        self.alert_table.verticalHeader().setVisible(False)
        
        layout.addWidget(self.alert_table)
        self.alert_tab.setLayout(layout)
        
    def update_statistics(self, stats_data):
        """
        更新统计信息
        
        Args:
            stats_data: 统计数据字典
        """
        self.stats_data = stats_data
        
        # 更新各个统计视图
        self._update_protocol_stats()
        self._update_ip_stats()
        self._update_port_stats()
        self._update_alerts()
        
    def _update_protocol_stats(self):
        """
        更新协议统计信息
        """
        if not self.stats_data or "protocol_stats" not in self.stats_data:
            return
            
        protocol_stats = self.stats_data.get("protocol_stats", [])
        
        # 更新表格
        self.protocol_table.setRowCount(len(protocol_stats))
        for row, (protocol, count) in enumerate(protocol_stats):
            self.protocol_table.setItem(row, 0, QTableWidgetItem(protocol))
            self.protocol_table.setItem(row, 1, QTableWidgetItem(str(count)))
            
    def _update_ip_stats(self):
        """
        更新IP统计信息
        """
        if not self.stats_data or "top_ips" not in self.stats_data:
            return
            
        ip_stats = self.stats_data.get("top_ips", [])
        
        # 更新表格
        self.ip_table.setRowCount(len(ip_stats))
        for row, (ip, count) in enumerate(ip_stats):
            self.ip_table.setItem(row, 0, QTableWidgetItem(ip))
            self.ip_table.setItem(row, 1, QTableWidgetItem(str(count)))
            
    def _update_port_stats(self):
        """
        更新端口统计信息
        """
        if not self.stats_data or "top_ports" not in self.stats_data:
            return
            
        port_stats = self.stats_data.get("top_ports", [])
        
        # 更新表格
        self.port_table.setRowCount(len(port_stats))
        for row, (port, count) in enumerate(port_stats):
            self.port_table.setItem(row, 0, QTableWidgetItem(port))
            self.port_table.setItem(row, 1, QTableWidgetItem(str(count)))
            
    def _update_alerts(self):
        """
        更新警报信息
        """
        if not self.stats_data or "alerts" not in self.stats_data:
            return
            
        alerts = self.stats_data.get("alerts", [])
        
        # 更新表格
        self.alert_table.setRowCount(len(alerts))
        
        # 设置背景颜色
        alert_bg_color = QColor(255, 240, 240)  # 浅红色
        
        for row, alert in enumerate(alerts):
            item = QTableWidgetItem(alert)
            item.setBackground(alert_bg_color)
            self.alert_table.setItem(row, 0, item)
            
        # 如果有警报，更新标签
        if alerts and self.tab_widget.currentIndex() != 3:  # 3是警报选项卡的索引
            self.tab_widget.setTabText(3, f"异常检测 ({len(alerts)})")
        else:
            self.tab_widget.setTabText(3, "异常检测")
            
    def clear(self):
        """
        清空统计信息
        """
        self.stats_data = None
        
        # 清空表格
        self.protocol_table.setRowCount(0)
        self.ip_table.setRowCount(0)
        self.port_table.setRowCount(0)
        self.alert_table.setRowCount(0) 